package day19.packageclass;

/**
 * WrapperClassTest类用于演示Java包装类的使用
 * 
 * Java为每种基本数据类型提供了对应的包装类：
 * - byte    -> Byte
 * - short   -> Short
 * - int     -> Integer
 * - long    -> Long
 * - float   -> Float
 * - double  -> Double
 * - char    -> Character
 * - boolean -> Boolean
 * 
 * 包装类的作用：
 * 1. 提供了将基本数据类型转换为对象的能力
 * 2. 包含了处理基本数据类型的有用方法
 * 3. 允许在需要对象的场合使用基本数据类型（如集合类）
 * 4. 支持自动装箱和拆箱操作
 */
public class WrapperClassTest {
    /**
     * 程序入口方法
     * 
     * 该方法演示了Integer包装类的各种常用操作，包括构造、转换、比较等，
     * 同时也展示了其他常用包装类如Double、Boolean、Character的使用方法。
     * 
     * @param args 命令行参数数组
     */
    public static void main(String[] args) {
        // 测试Integer包装类
        System.out.println("=== Integer包装类测试 ===");
        
        // 基本数据类型转包装类
        // 定义一个int类型的基本数据变量
        int num1 = 100;
        // 使用Integer构造方法将int转换为Integer对象（已废弃，不推荐使用）
        // 注意：该构造方法在Java 9中已被标记为废弃，在Java 17中已被移除
        Integer integer1 = new Integer(num1);  
        // 使用Integer.valueOf()静态方法将int转换为Integer对象（推荐方式）
        // 该方法利用了对象缓存机制，提高性能
        Integer integer2 = Integer.valueOf(num1);  
        // 使用自动装箱机制将int自动转换为Integer对象（最简洁的方式）
        // 编译器会自动调用Integer.valueOf()方法完成转换
        Integer integer3 = num1;  
        
        System.out.println("int转Integer: " + integer1);
        System.out.println("Integer.valueOf: " + integer2);
        System.out.println("自动装箱: " + integer3);
        
        // 包装类转基本数据类型
        // 创建一个Integer对象
        Integer integer4 = new Integer(200);
        // 使用intValue()方法将Integer对象转换为int基本数据类型
        int num2 = integer4.intValue();  
        System.out.println("Integer转int: " + num2);
        
        // 使用自动拆箱机制将Integer对象自动转换为int基本数据类型
        // 编译器会自动调用intValue()方法完成转换
        int num3 = integer4;
        System.out.println("自动拆箱: " + num3);
        
        // 字符串转包装类
        // 定义一个数字字符串
        String str = "300";
        // 使用Integer.valueOf()静态方法将字符串转换为Integer对象
        // 该方法会解析字符串内容，如果无法解析会抛出NumberFormatException异常
        Integer integer5 = Integer.valueOf(str);
        // 使用Integer.parseInt()静态方法将字符串转换为int基本数据类型
        // 注意：parseInt()方法返回的是int基本数据类型，这里会通过自动装箱转换为Integer对象
        Integer integer6 = Integer.parseInt(str);  
        System.out.println("字符串转Integer: " + integer5);
        System.out.println("parseInt转Integer: " + integer6);
        
        // 包装类转字符串
        // 创建一个Integer对象
        Integer integer7 = 400;
        // 使用toString()方法将Integer对象转换为字符串
        String str2 = integer7.toString();
        // 使用String.valueOf()静态方法将Integer对象转换为字符串
        // 该方法可以接受任何对象作为参数，内部会调用对象的toString()方法
        String str3 = String.valueOf(integer7);
        System.out.println("Integer转字符串: " + str2);
        System.out.println("String.valueOf转字符串: " + str3);
        
        // 包装类的常量
        // 每个数值型包装类都定义了最大值和最小值常量
        System.out.println("\n=== 包装类常量 ===");
        // Integer.MAX_VALUE表示int类型的最大值 2^31-1 = 2147483647
        System.out.println("Integer最大值: " + Integer.MAX_VALUE);
        // Integer.MIN_VALUE表示int类型的最小值 -2^31 = -2147483648
        System.out.println("Integer最小值: " + Integer.MIN_VALUE);
        // Byte.MAX_VALUE表示byte类型的最大值 2^7-1 = 127
        System.out.println("Byte最大值: " + Byte.MAX_VALUE);
        // Byte.MIN_VALUE表示byte类型的最小值 -2^7 = -128
        System.out.println("Byte最小值: " + Byte.MIN_VALUE);
        
        // 包装类比较
        // 演示包装类对象比较时需要注意的问题
        System.out.println("\n=== 包装类比较 ===");
        // 对于-128到127之间的Integer对象，Java会缓存这些对象
        // 所以a和b实际上引用同一个对象
        Integer a = 127;
        Integer b = 127;
        // 对于超出-128到127范围的Integer对象，不会使用缓存
        // 所以c和d是不同的对象实例
        Integer c = 128;
        Integer d = 128;
        
        // 由于缓存机制，a和b引用同一个对象，所以==比较返回true
        System.out.println("a == b: " + (a == b));  // true (缓存范围内)
        // c和d是不同的对象实例，所以==比较返回false
        System.out.println("c == d: " + (c == d));  // false (超出缓存范围)
        // equals方法比较对象的值，所以都返回true
        System.out.println("a.equals(b): " + a.equals(b));  // true
        System.out.println("c.equals(d): " + c.equals(d));  // true
        
        // 其他包装类示例
        // 演示其他包装类的使用
        System.out.println("\n=== 其他包装类示例 ===");
        // Double包装类，对应double基本类型
        Double doubleValue = 3.14;
        // Boolean包装类，对应boolean基本类型
        Boolean booleanValue = true;
        // Character包装类，对应char基本类型
        Character charValue = 'A';
        
        System.out.println("Double值: " + doubleValue);
        System.out.println("Boolean值: " + booleanValue);
        System.out.println("Character值: " + charValue);
    }
}